package com.taotao.cart.task;

import com.taotao.cart.constants.CartConstants;
import com.taotao.cart.domain.PmsCartItems;
import com.taotao.cart.service.CartService;
import com.taotao.common.core.domain.Result;
import com.taotao.common.redis.service.RedisService;
import com.taotao.remote.SkuInfoRemoteService;
import jakarta.annotation.Resource;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;

@Component
public class SynchronousCart {
    @Resource
    private RedisService redisService;

    @Resource
    private CartService cartService;

    @Resource
    private SkuInfoRemoteService skuInfoRemoteService;

    //定时任务 每10秒钟同步一次
    @Scheduled(cron = "0/10 * * * * ?")
    public void synchronousCart() {
        System.out.println("同步购物车");
        //获取所有的键
        Collection<String> keys = redisService.keys(CartConstants.CART_KEY+"*");

        //最终添加对象
        ArrayList<PmsCartItems> addCartItemsList = new ArrayList<>();

        //最终修改对象
        ArrayList<PmsCartItems> updateCartItemsList = new ArrayList<>();
        if(!keys.isEmpty()){
            // 遍历所有 key
            for (String key : keys) {
                // 获取用户 ID
                String userId = key.split(":")[1];
                Long userIdLong = Long.valueOf(userId);

                // 通过用户 ID 获取对应的购物车 ID
                Long cartId = cartService.selectCartByUserId(userIdLong);

                // 从缓存中获取用户购物车的 SKU 信息
                Map<String, Integer> cacheMap = redisService.getCacheMap(CartConstants.CART_KEY + userId);
                List<String> skuIds = new ArrayList<>(cacheMap.keySet());

                // 遍历每个 SKU
                for (String skuId : skuIds) {
                    // 创建一个新的购物车项对象
                    PmsCartItems addPmsCartItems = new PmsCartItems();

                    // 设置购物车 ID
                    addPmsCartItems.setCartId(cartId);

                    // 远程调用获取商户 ID
                    Result<Long> longResult = skuInfoRemoteService.selectMerchantIdsBySkuIds(Long.valueOf(skuId));
                    if (longResult.getCode() == Result.SUCCESS) {
                        Long merchantId = longResult.getData();
                        if (merchantId != null) {
                            addPmsCartItems.setMerchantsId(merchantId);
                        }
                    }

                    // 设置 SKU ID 和数量
                    addPmsCartItems.setSkuId(Long.valueOf(skuId));
                    Integer quantity = cacheMap.get(skuId);
                    addPmsCartItems.setQuantity(quantity);

                    // 查询购物车明细
                    PmsCartItems pmsCartItems = cartService.selectCartItemsBySkuIdCartIdAndQuantity(Long.valueOf(skuId), cartId);

                    if (pmsCartItems != null) {
                        // 如果购物车中已存在该 SKU，且数量不一致，则更新
                        if (pmsCartItems.getQuantity() != quantity) {
                            pmsCartItems.setQuantity(quantity);
                            updateCartItemsList.add(pmsCartItems);
                        }
                    } else {
                        // 如果购物车中不存在该 SKU，则添加到新增列表
                        addCartItemsList.add(addPmsCartItems);
                    }
                }
            }
        }
        //数据处理完毕后 批量操作数据库
        if(!addCartItemsList.isEmpty()){
            cartService.addInBulkCartItems(addCartItemsList);
        }
        if(!updateCartItemsList.isEmpty()){
            cartService.updateInBulkCartItems(updateCartItemsList);
        }
    }
}
